// 全端通用的方法可以写在这里

/**
 * 获取静态资源路径
 * @param path 相对于static目录的路径，如 'images/icon/dingwei.png'
 * @returns 完整的静态资源路径
 */
export const getStaticPath = (path: string): string => {
	// 移除开头的斜杠，确保路径格式一致
	const cleanPath = path.startsWith('/') ? path.slice(1) : path
	
	// #ifdef H5
	// H5环境下使用绝对路径
	const baseUrl = import.meta.env.DEV ? '' : ''
	return `${baseUrl}/${cleanPath}`
	// #endif
	
	// #ifndef H5
	// 非H5环境下也使用绝对路径
	return `/${cleanPath}`
	// #endif
}

/**
 * 获取图片资源路径
 * @param imagePath 图片路径，如 'images/img/wxm.jpg'
 * @returns 完整的图片路径
 */
export const getImagePath = (imagePath: string): string => {
	return getStaticPath(imagePath)
}

/**
 * 检查图片是否存在
 * @param imagePath 图片路径
 * @returns Promise<boolean>
 */
export const checkImageExists = (imagePath: string): Promise<boolean> => {
	return new Promise((resolve) => {
		const img = new Image()
		img.onload = () => resolve(true)
		img.onerror = () => resolve(false)
		img.src = getImagePath(imagePath)
	})
}

/**
 * 预加载图片
 * @param imagePaths 图片路径数组
 * @returns Promise<void>
 */
export const preloadImages = async (imagePaths: string[]): Promise<void> => {
	const promises = imagePaths.map(path => {
		return new Promise<void>((resolve) => {
			const img = new Image()
			img.onload = () => resolve()
			img.onerror = () => resolve() // 即使加载失败也不阻塞
			img.src = getImagePath(path)
		})
	})
	
	await Promise.all(promises)
}

/**
 * 保存图片到手机
 * @param url 图片的路径，可以是相对路径，临时文件路径，存储文件路径，网络图片路径
 */
export const saveImageToPhotosAlbum = (url : string) : Promise<void> => {
	return new Promise(async (resolve, reject) => {
		// 当前是否为网络图片
		const isNetworkImage = url.startsWith('http://') || url.startsWith('https://')

		// #ifdef H5
		// 在uniapp环境中打开的webview的h5网页，可以使用plus对象
		if (navigator.userAgent.indexOf('uni-app') !== -1) {
			plus.gallery.save(url, () => {
				uni.showToast({
					title: '保存成功',
					icon: 'success'
				})
				resolve()
			}, () => {
				uni.$tao.toast('保存失败')
				reject()
			})
		} else {
			try {
				const filePath = await downloadFile(url)
				const oA = document.createElement('a')
				oA.download = ''
				oA.href = filePath
				document.body.appendChild(oA)
				oA.click()
				oA.remove()
				uni.showToast({
					title: '保存成功',
					icon: 'success'
				})
				resolve()
			} catch {
				reject()
			}
		}
		// #endif

		// #ifndef H5
		try {
			let filePath = url
			if (isNetworkImage) filePath = await downloadFile(url)

			// 保存图片到系统相册
			uni.saveImageToPhotosAlbum({
				filePath,
				success: () => {
					uni.showToast({
						title: '保存成功',
						icon: 'success'
					})
					resolve()
				},
				fail: (err) => {
					uni.$tao.toast('保存图片失败：' + err.errMsg)
					reject()
				}
			})
		} catch {
			reject()
		}
		// #endif
	})
}

/**
 * 下载文件资源到本地
 * @param url 下载资源的 url
 * @param header HTTP 请求 Header, header 中不能设置 Referer
 * @param filePath 指定文件下载后存储的路径 (本地路径)
 * @return 返回文件的本地临时路径
 */
export const downloadFile = (url : string, header : Record<string, string> = {}, filePath ?: string) : Promise<string> => {
	return new Promise((resolve, reject) => {
		uni.downloadFile({
			url,
			header,
			filePath,
			success: (res) => {
				if (res.statusCode === 200) {
					resolve(res.tempFilePath)
				} else {
					if (res.errMsg) uni.$tao.toast(res.errMsg)
					reject(new Error(res.errMsg))
				}
			},
			fail: (err) => {
				uni.$tao.toast('下载文件失败')
				reject(new Error(err))
			}
		})
	})
}